/**
 * 定义函数的方式：
 * 1.函数声明：function 是声明中的第一个词 作用域绑定 绑定在函数所在的作用域 比如 function foo() {} foo被绑定在声明时的作用域 例子中是全局 也就是 window
 * 2.函数表达式：常见的以(!±~等开头的，都是函数表达式。箭头函数也是。
 * 3.new Function构造函数
 * 这里讨论函数声明、函数表达式的区别
 */

  // 函数声明
  function say(){
    console.log('函数声明');
  }

  // 函数表达式
  var say = function(){
    console.log('函数表达式');
  }


  /**  
   * 
   * 1).以函数声明的方法定义的函数,【函数名是必须的】,而函数表达式的【函数名是可选的】。（函数声明整体会被提升到当前作用域的顶部，函数表达式也提升到顶部但是只有其变量名提升）

  2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用。

  3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们【不能出现在循环】,条件或者try/catch/finally中,而函数表达式可以在任何地方声明。换句话说，函数声明不是一个完整的语句，所以不能出现在if-else,for循环，finally，try catch语句以及with语句中。
  */


  say();
  var say = function(){
    console.log('函数表达式');
  }
  say();
  function say(){
    console.log('函数声明');
  }
  say();

  /**
   * 执行结果
   * 函数声明
    函数表达式
    函数表达式 */
/** 
 * 注意：
 * javascript解释器中存在一种【变量声明被提升】的机制，也就是说函数声明会被提升到作用域的最前面，即使写代码的时候是写在最后面，也还是会被提升至最前面。
    而用函数表达式创建的函数是在运行时进行赋值，且要等到表达式赋值完成后才能调用
    1.变量声明被提升
 */
